package com.cj.core.common;

import com.cj.core.constant.Constants;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

import static com.cj.core.constant.Constants.DATE_FORMAT_DAY;

/**
 * @Description
 * @Author 陈军（tel:13984919416）
 * @Date 2022年08月20日 19:02
 */
public class DateUtil {

    /**
     * 日期格式化
     *
     * @param date 日期
     * @param format 日期格式
     */
    public static String dateFormat(Date date, String format) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(DateTimeFormatter.ofPattern(format));
    }

    /**
     * 获取今天的日期格式化:yyyy-MM-dd HH:mm:ss
     */
    public static String nowDateTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(Constants.DATE_FORMAT_SECOND));
    }

    /**
     * 获取今天的日期格式化:yyyy-MM-dd
     */
    public static String nowDate() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(DATE_FORMAT_DAY));
    }

    /**
     * 获取今天的日期格式化:yyyyMMdd
     */
    public static String nowDateSimple() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(Constants.DATE_SIMPLE_FORMAT_DAY));
    }

    /**
     * 获取今天的日期格式化:HH:mm:ss
     */
    public static String nowTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(Constants.SECOND_FORMAT));
    }

    /**
     * 获得该月第一天
     *
     * @param date
     * @return
     */
    public static String getFirstDayOfMonth(String date) {
        int[] dates = parseYearAndMonth(date);
        int year = dates[0];
        int month = dates[1];
        Calendar cal = Calendar.getInstance();
        // 设置年份
        cal.set(Calendar.YEAR, year);
        // 设置月份
        cal.set(Calendar.MONTH, month - 1);
        // 获取某月最小天数
        int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        // 设置日历中月份的最小天数
        cal.set(Calendar.DAY_OF_MONTH, firstDay);
        // 格式化日期
        return dateFormat(cal.getTime(), DATE_FORMAT_DAY);
    }

    /**
     * 获得该月最后一天
     *
     * @param date
     * @return
     */
    public static String getLastDayOfMonth(String date) {
        int[] dates = parseYearAndMonth(date);
        int year = dates[0];
        int month = dates[1];
        Calendar cal = Calendar.getInstance();
        // 设置年份
        cal.set(Calendar.YEAR, year);
        // 设置月份
        cal.set(Calendar.MONTH, month - 1);
        // 获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        // 设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        // 格式化日期
        return dateFormat(cal.getTime(), DATE_FORMAT_DAY);
    }

    /**
     * 解析年份和月份
     *
     * @param date
     * @return
     */
    private static int[] parseYearAndMonth(String date) {
        int year = Integer.parseInt(date.substring(0, date.indexOf("-")));
        int month = Integer.parseInt(date.substring(date.indexOf("-") + 1));
        return new int[]{year, month};
    }


    /**
     * 字符串转日期时分秒，字符串格式：yyyy-MM-dd HH:mm:ss
     * */
    public static Date parseDateTime(String date) {
        return parseDate(date, Constants.DATE_FORMAT_SECOND);
    }

    public static Date parseDate(String date) {
        return parseDate(date, Constants.DATE_FORMAT_DAY);
    }

    public static Date parseDate(String date, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        LocalDate localDate = LocalDate.parse(date, formatter);
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    public static void main(String[] args) {
        System.out.println(getFirstDayOfMonth("2024-08"));
        System.out.println(getLastDayOfMonth("2024-08"));
        System.out.println(nowDateTime());
        System.out.println(nowDate());
        System.out.println(nowTime());
        System.out.println(nowDateSimple());
        System.out.println(parseDate("2024-08-01"));
        System.out.println(parseDateTime("2024-08-01 08:08:08"));
    }
}
